Apache Commons Collections একটি শক্তিশালী লাইব্রেরি যা Java Collections Framework-এর উপর অতিরিক্ত ক্ষমতা এবং কার্যকারিতা যোগ করে। এই লাইব্রেরিটি Decorators এবং Wrapped Collections সরবরাহ করে, যা কোলেকশনের বৈশিষ্ট্য বাড়াতে এবং কাস্টম আচরণ প্রদান করতে সহায়তা করে। Decorator এবং Wrapped Collections উভয়ই কোলেকশনের আচার-আচরণ পরিবর্তন করতে ব্যবহৃত হয়, যেমন কোলেকশনের উপাদানগুলি ফিল্টার করা, কোলেকশনের স্টেটাস পরিবর্তন করা, এবং আরও অনেক কিছু।
এই নিবন্ধে আমরা Decorators এবং Wrapped Collections এর কাজ এবং ব্যবহারের উপায় নিয়ে বিস্তারিত আলোচনা করব।
Decorator প্যাটার্ন একটি ডিজাইন প্যাটার্ন যা মূল অবজেক্টের আচরণ পরিবর্তন করতে ব্যবহৃত হয়, তবে অবজেক্টের মূল কাঠামো অপরিবর্তিত থাকে। Apache Commons Collections-এ Decorators কোলেকশনের অবজেক্টের উপরে অতিরিক্ত আচরণ যোগ করতে ব্যবহার করা হয়। এটি কোলেকশনের আচরণ পরিবর্তন করতে সাহায্য করে, যেমন কোলেকশনে আইটেম অ্যাড বা রিমুভ করা, অথবা কোলেকশনের উপাদানগুলির উপর শর্ত প্রয়োগ করা ইত্যাদি।
Collection Decorators সাধারণত একটি বিদ্যমান কোলেকশন ক্লাসকে মোড়ানো (wrap) করে এবং সেই কোলেকশনের ওপর নতুন আচরণ বা ফাংশন যোগ করে।
ListDecorator হল একটি সাধারণ উদাহরণ যেখানে একটি List কোলেকশনের উপরে অতিরিক্ত কার্যকারিতা যোগ করা হয়।
import org.apache.commons.collections4.ListUtils;
import java.util.ArrayList;
import java.util.List;
public class DecoratorExample {
public static void main(String[] args) {
// Create a list
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
// Decorate the list with additional functionality
List<String> decoratedList = ListUtils.predicatedList(list, s -> s.length() > 5);
// Adding a valid element (length > 5)
decoratedList.add("cherry");
// Adding an invalid element (length <= 5), this will not be added due to the predicate
decoratedList.add("kiwi");
System.out.println(decoratedList); // Output: [apple, banana, cherry]
}
}
এখানে:
ListUtils.predicatedList()
মেথড ব্যবহার করে একটি predicate যোগ করা হয়েছে যা কেবলমাত্র পাঁচ অক্ষরের বেশি দৈর্ঘ্য সম্পন্ন উপাদান কোলেকশনে যোগ করতে দেয়।ListDecorator কোলেকশনকে মোড়ানো (wrap) করে, এবং predicate যোগ করে যাতে ফিল্টারিং কার্যকারিতা প্রদান করা যায়।
MapDecorator-এর মাধ্যমে আপনি একটি ম্যাপ কোলেকশনের উপর অতিরিক্ত বৈশিষ্ট্য যোগ করতে পারেন।
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class MapDecoratorExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 20);
// Decorate the map to make all values positive
Map<String, Integer> decoratedMap = MapUtils.transformValues(map, value -> Math.abs(value));
System.out.println(decoratedMap); // Output: {apple=10, banana=20}
}
}
এখানে:
MapUtils.transformValues()
মেথড ব্যবহার করে Map কোলেকশনকে Decorator করা হয়েছে যাতে সব মান পজিটিভ (positive) হয়ে যায়। এটি মানের পরিবর্তন করবে এবং ম্যাপের প্রতি উপাদানকে নতুন আচরণ দেবে।Wrapped Collections হল সেই কোলেকশনগুলি যা অন্য একটি কোলেকশনের উপরে "wrap" করা হয়, অর্থাৎ মূল কোলেকশনের আচরণ এবং স্টেটাস পরিবর্তন না করেই অতিরিক্ত কার্যকারিতা যোগ করা হয়। Wrapped Collections প্রাথমিক কোলেকশনের সকল কার্যকারিতা বজায় রাখে এবং নতুন ফিচার যোগ করে।
Wrapped Collections সাধারণত এমন কোলেকশন ক্লাস হয় যা কেবলমাত্র কিছু অতিরিক্ত কাস্টম কার্যকারিতা প্রদান করে। এটি কোলেকশনগুলির পছন্দসই আচরণ তৈরি করতে সাহায্য করে।
Unmodifiable Collection এমন একটি wrapped কোলেকশন যা কেবলমাত্র পঠনযোগ্য হয়, অর্থাৎ এর মধ্যে কোন উপাদান পরিবর্তন করা যায় না।
import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
import java.util.ArrayList;
public class WrappedCollectionExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
// Wrap the list into an unmodifiable collection
List<String> unmodifiableList = CollectionUtils.unmodifiableList(list);
// Attempt to modify the list will throw an UnsupportedOperationException
unmodifiableList.add("cherry"); // Throws UnsupportedOperationException
}
}
এখানে:
CollectionUtils.unmodifiableList()
মেথড ব্যবহার করে একটি কোলেকশনকে unmodifiable করা হয়েছে। এটি কোলেকশনের উপাদানগুলো পরিবর্তন করতে দেয় না এবং শুধুমাত্র পড়তে দেয়।Synchronized Collection কোলেকশনের উপর থ্রেড-সেফ কার্যকারিতা যোগ করতে ব্যবহৃত হয়, যাতে এটি মাল্টিথ্রেড পরিবেশে নিরাপদ থাকে।
import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
import java.util.ArrayList;
public class SynchronizedCollectionExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
// Wrap the list into a synchronized collection
List<String> synchronizedList = CollectionUtils.synchronizedList(list);
synchronizedList.add("cherry"); // This operation is now thread-safe
}
}
এখানে:
CollectionUtils.synchronizedList()
মেথড ব্যবহার করে কোলেকশনটি থ্রেড-সেফ করা হয়েছে। এখন এটি মাল্টিথ্রেড অ্যাক্সেসের জন্য নিরাপদ।Decorators এবং Wrapped Collections দুটি গুরুত্বপূর্ণ কনসেপ্ট যা Apache Commons Collections লাইব্রেরি সরবরাহ করে। Decorators কোলেকশনের উপরে অতিরিক্ত আচরণ বা কার্যকারিতা যোগ করে, যেখানে Wrapped Collections কোলেকশনের আচরণে পরিবর্তন না এনে নতুন বৈশিষ্ট্য (যেমন থ্রেড সেফটি বা অপরিবর্তনীয়তা) যোগ করে। এই দুটি কনসেপ্ট কোলেকশন ম্যানিপুলেশনের ক্ষেত্রে অনেক সুবিধা প্রদান করে, যেমন কোলেকশনের শর্তসাপেক্ষ পরিবর্তন, সুরক্ষা বৃদ্ধি এবং আরো অনেক কিছু।
Apache Commons Collections লাইব্রেরির Collection Decorators ক্লাসগুলি Java Collections Framework (JCF)-এর ডেটা স্ট্রাকচারে অতিরিক্ত কার্যকারিতা যোগ করার জন্য ব্যবহৃত হয়। Decorator pattern হল একটি স্ট্রাকচারাল ডিজাইন প্যাটার্ন যা অবজেক্টের উপর নতুন ফাংশনালিটি যোগ করার জন্য ব্যবহৃত হয়, কোন কিছুর মূল স্ট্রাকচার পরিবর্তন না করে। এটি একই সময় existing object এর আচরণ পরিবর্তন বা প্রসারিত করতে সাহায্য করে।
Collection Decorators হল এমন ক্লাস যা collections এর কার্যকারিতা বাড়াতে বা কাস্টমাইজ করতে ব্যবহৃত হয়। একে wrapper objects হিসেবে ভাবা যেতে পারে, যেখানে একটি ইন্টারফেস বা ক্লাসের অভ্যন্তরে অন্য একটি collection অবজেক্টের উপর অতিরিক্ত আচরণ যোগ করা হয়। Decorator pattern এর মাধ্যমে একটি অবজেক্টের কার্যকারিতা পরিবর্তন করার বদলে, তার উপরে নতুন ফিচার যোগ করা হয়।
যেমন, আপনি যদি একটি List বা Map এর উপর কিছু অতিরিক্ত কার্যকলাপ (যেমন সিঙ্ক্রোনাইজেশন, ইমিউটেবিলিটি) চান, তাহলে আপনি একটি Decorator ব্যবহার করতে পারেন যা ওই ফিচারটি সুনিশ্চিত করবে।
Apache Commons Collections লাইব্রেরি Collection Decorators এর মাধ্যমে বিভিন্ন ধরনের অতিরিক্ত কার্যকারিতা যোগ করার সুযোগ দেয়, যেমন Synchronized collections, Unmodifiable collections, Predicated collections ইত্যাদি। নিচে কিছু সাধারণ Collection Decorators এর উদাহরণ দেওয়া হলো:
Unmodifiable collections হল এমন কালেকশন যা immutable (অপরিবর্তনীয়), যেখানে আপনি ডেটা পরিবর্তন করতে পারবেন না। এটি সাধারণত তখন ব্যবহৃত হয় যখন আপনি চান যে, কিছু Collection ডেটা নিরাপদভাবে শুধুমাত্র পড়ার জন্য ব্যবহার করা হোক।
Unmodifiable Collection ডেকোরেটরের উদাহরণ:
import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
import java.util.Arrays;
public class UnmodifiableCollectionExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "cherry");
// Creating an unmodifiable collection
List<String> unmodifiableList = CollectionUtils.unmodifiableList(list);
System.out.println("Unmodifiable List: " + unmodifiableList);
// Attempting to modify will throw UnsupportedOperationException
// unmodifiableList.add("date"); // This will throw exception
}
}
এখানে:
আউটপুট:
Unmodifiable List: [apple, banana, cherry]
এটি immutable collection তৈরি করে, যেটি কোনো পরিবর্তন গ্রহণ করবে না।
Synchronized Collections হল এমন কালেকশন যেগুলি একাধিক থ্রেডের মধ্যে নিরাপদভাবে ব্যবহৃত হতে পারে। যখন আপনি একাধিক থ্রেডের সাথে কাজ করেন এবং কালেকশনের উপরে একযোগে অপারেশন চালাতে চান, তখন synchronized collections ব্যবহার করা হয়।
Synchronized Collection ডেকোরেটরের উদাহরণ:
import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
import java.util.Arrays;
public class SynchronizedCollectionExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "cherry");
// Creating a synchronized collection
List<String> synchronizedList = CollectionUtils.synchronizedList(list);
synchronized(synchronizedList) {
synchronizedList.add("date");
System.out.println(synchronizedList);
}
}
}
এখানে:
আউটপুট:
[apple, banana, cherry, date]
এটি নিশ্চিত করে যে, যখন একাধিক থ্রেড একই কালেকশনের উপরে কাজ করে, তখন ডেটা সুরক্ষিত থাকে।
Predicated collections হল এমন কালেকশন যা একটি নির্দিষ্ট শর্ত বা predicate (যেমন একটি ফিল্টার) এর উপর ভিত্তি করে কার্যকরী হয়। এটি আপনাকে কালেকশনের মধ্যে শুধু নির্দিষ্ট ধরনের উপাদান সংরক্ষণ করতে সাহায্য করে।
Predicated Collection ডেকোরেটরের উদাহরণ:
import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
import java.util.ArrayList;
public class PredicatedCollectionExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
// Creating a predicated collection that only allows strings with length greater than 5
List<String> predicatedList = CollectionUtils.predicatedList(list, str -> str.length() > 5);
predicatedList.add("grapefruit");
System.out.println(predicatedList); // Output: [grapefruit]
// Trying to add an invalid string
predicatedList.add("pear"); // This will not be added
System.out.println(predicatedList); // Output: [grapefruit]
}
}
এখানে:
আউটপুট:
[grapefruit]
[grapefruit]
এটি কেবলমাত্র নির্দিষ্ট শর্ত পূর্ণকারী উপাদানগুলি কেবলমাত্র List-এ যোগ করতে অনুমতি দেয়।
Collection Decorators হল একটি শক্তিশালী টুল যা Apache Commons Collections লাইব্রেরিতে Java Collections Framework-এর উপরে অতিরিক্ত কার্যকারিতা যোগ করতে ব্যবহৃত হয়। এগুলি Java ডেভেলপারদের জন্য বিভিন্ন ধরনের স্ট্যান্ডার্ড কোলেকশন ডেটা স্ট্রাকচারের উপর functional extensions প্রদান করে, যেমন immutable collections, synchronized collections, এবং predicated collections। Decorator pattern ব্যবহার করে এই কার্যকারিতা যোগ করা হয়, যা মূল ডেটা স্ট্রাকচারের কার্যকারিতা পরিবর্তন না করে নতুন ফিচার সরবরাহ করে।
Apache Commons Collections একটি শক্তিশালী লাইব্রেরি যা Java Collections Framework এর উপর ভিত্তি করে অতিরিক্ত কার্যকারিতা এবং ডাটা স্ট্রাকচার সরবরাহ করে। এর মধ্যে Synchronized Collections এবং Unmodifiable Collections তৈরি করার জন্য বিভিন্ন সুবিধাজনক ইউটিলিটি ক্লাস রয়েছে, যা আপনাকে থ্রেড সেফ কালেকশন তৈরি এবং কালেকশন পরিবর্তন প্রতিরোধ করতে সাহায্য করে।
Synchronized Collections এমন কালেকশন, যা Thread-safe হয়, অর্থাৎ একাধিক থ্রেড একই কালেকশনে একই সময়ে ডেটা অ্যাক্সেস বা পরিবর্তন করতে পারে না। এতে আপনি সহজেই নিশ্চিত করতে পারেন যে, কালেকশন এর উপর কোনো একসাথে একাধিক থ্রেড কাজ করলে ডেটার কোন ধরনের ক্ষতি বা অসামঞ্জস্য হবে না।
Synchronized Collections তৈরি করতে Collections.synchronizedXXX() পদ্ধতি ব্যবহার করা হয়। তবে, Apache Commons Collections এ এই ধরনের বিশেষ Synchronized Collections এর জন্যও ইউটিলিটি ক্লাস প্রদান করা হয়েছে।
Apache Commons Collections তে SynchronizedCollection
, SynchronizedList
, SynchronizedSet
, SynchronizedMap
ইত্যাদি ক্লাস ব্যবহার করে সিঙ্ক্রোনাইজড কালেকশন তৈরি করা যায়।
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.list.SynchronizedList;
import java.util.ArrayList;
import java.util.List;
public class SynchronizedCollectionExample {
public static void main(String[] args) {
// Create a normal list
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
// Make the list synchronized
List<String> synchronizedList = CollectionUtils.synchronizedList(list);
// Access the synchronized list in a thread-safe manner
synchronized(synchronizedList) {
synchronizedList.forEach(System.out::println);
}
}
}
এখানে:
CollectionUtils.synchronizedList()
ব্যবহার করে ArrayList কে Thread-safe সিঙ্ক্রোনাইজড লিস্টে রূপান্তরিত করা হয়েছে।import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.set.SynchronizedSet;
import java.util.HashSet;
import java.util.Set;
public class SynchronizedSetExample {
public static void main(String[] args) {
// Create a normal set
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("cherry");
// Make the set synchronized
Set<String> synchronizedSet = CollectionUtils.synchronizedSet(set);
// Access the synchronized set in a thread-safe manner
synchronized(synchronizedSet) {
synchronizedSet.forEach(System.out::println);
}
}
}
এখানে:
CollectionUtils.synchronizedSet()
ব্যবহার করে HashSet কে Thread-safe সিঙ্ক্রোনাইজড সেটে রূপান্তরিত করা হয়েছে।Unmodifiable Collections এমন কালেকশন যেগুলোর উপাদান পরিবর্তন করা সম্ভব নয়। একবার যদি একটি কালেকশন unmodifiable হয়ে যায়, তাহলে আপনি সেই কালেকশনে নতুন আইটেম অ্যাড বা রিমুভ করতে পারবেন না, শুধুমাত্র পড়া (read) সম্ভব হবে। এই ধরনের কালেকশন নিরাপত্তা নিশ্চিত করতে সাহায্য করে, যেমন: আপনার ডেটা যাতে অপ্রত্যাশিতভাবে পরিবর্তিত না হয়।
Unmodifiable Collections তৈরি করতে Collections.unmodifiableXXX() পদ্ধতি ব্যবহার করা হয়। তবে, Apache Commons Collections লাইব্রেরি UnmodifiableCollection
, UnmodifiableList
, UnmodifiableSet
, UnmodifiableMap
ইত্যাদি ক্লাসও প্রদান করে।
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.list.UnmodifiableList;
import java.util.ArrayList;
import java.util.List;
public class UnmodifiableListExample {
public static void main(String[] args) {
// Create a normal list
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
// Make the list unmodifiable
List<String> unmodifiableList = CollectionUtils.unmodifiableList(list);
// Try to modify the list (will throw UnsupportedOperationException)
// unmodifiableList.add("date"); // Uncommenting this line will throw an exception
// Print the list
unmodifiableList.forEach(System.out::println);
}
}
এখানে:
CollectionUtils.unmodifiableList()
ব্যবহার করে একটি ArrayList কে Unmodifiable লিস্টে রূপান্তরিত করা হয়েছে।unmodifiableList.add("date")
লাইনটি কমেন্ট করলে চলবে, তবে এটি অ্যাড করার চেষ্টা করলে UnsupportedOperationException
ফেলে।import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.set.UnmodifiableSet;
import java.util.HashSet;
import java.util.Set;
public class UnmodifiableSetExample {
public static void main(String[] args) {
// Create a normal set
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("cherry");
// Make the set unmodifiable
Set<String> unmodifiableSet = CollectionUtils.unmodifiableSet(set);
// Try to modify the set (will throw UnsupportedOperationException)
// unmodifiableSet.add("date"); // Uncommenting this line will throw an exception
// Print the set
unmodifiableSet.forEach(System.out::println);
}
}
এখানে:
CollectionUtils.unmodifiableSet()
ব্যবহার করে HashSet কে Unmodifiable সেটে রূপান্তরিত করা হয়েছে।Feature | Synchronized Collection | Unmodifiable Collection |
---|---|---|
Purpose | Thread-safety and concurrency | Prevent modification (immutability) |
Modification | Allowed, but thread-safe | Not allowed (no modification) |
Use Case | Used when multiple threads access and modify collections | Used to protect data from unintended modifications |
Performance | Slightly slower due to synchronization | More performant as no locks or synchronization are needed |
Implementation | Synchronized using locking mechanisms | Wraps the collection to prevent modification |
Synchronized Collections এবং Unmodifiable Collections দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা Apache Commons Collections লাইব্রেরি প্রদান করে। Synchronized Collections থ্রেড সেফ কালেকশন তৈরি করে, যেখানে একাধিক থ্রেড একই সময় কালেকশনে ডেটা অ্যাক্সেস বা পরিবর্তন করতে পারে না। অন্যদিকে, Unmodifiable Collections নিশ্চিত করে যে একবার তৈরি হওয়া কালেকশন পরিবর্তন করা যাবে না, যা ডেটা নিরাপত্তা এবং স্থিরতা বজায় রাখে। উভয় ধরনের কালেকশন আপনাকে নিরাপদ এবং কার্যকরী ডাটা ম্যানেজমেন্ট নিশ্চিত করতে সাহায্য করে, বিশেষ করে মাল্টি-থ্রেডেড পরিবেশে বা ডেটার স্থিরতা বজায় রাখতে।
Lazy Collections হল এমন ধরনের কালেকশন যা কেবল তখনই উপাদান বা মান গণনা বা তৈরি করে যখন সেগুলি প্রকৃতপক্ষে প্রয়োজন হয়। এটি Lazy Evaluation ধারণার উপর ভিত্তি করে কাজ করে, যার মাধ্যমে কালেকশনের উপাদানগুলো প্রয়োজন না হওয়া পর্যন্ত হিসাব করা বা তৈরি করা হয় না। Lazy Collections ব্যবহার করার মাধ্যমে আপনি মেমরি এবং প্রক্রিয়াকরণ সময় সাশ্রয় করতে পারেন, বিশেষত যখন আপনার বড় আকারের ডেটা স্ট্রাকচার বা সংগ্রহে কাজ করতে হয়।
Apache Commons Collections লাইব্রেরিতে কিছু Lazy Collection তৈরি করার জন্য ইউটিলিটি সরঞ্জাম সরবরাহ করা হয়, যা আপনার কাজকে আরও কার্যকরী করে তোলে।
Lazy Collections এমন কালেকশন যা অটো বা বিকল্পভাবে উপাদানগুলি রিট্রিভ করে এবং হিসাব করে, অর্থাৎ উপাদানগুলি তখনই তৈরি হয় যখন সেগুলি অ্যাক্সেস করা হয়। এর ফলে সম্পূর্ণ কালেকশন মেমরিতে লোড না হয়ে শুধুমাত্র প্রয়োজনীয় উপাদানগুলো লোড হয়।
এটি বড় কালেকশনগুলিতে বিশেষভাবে উপকারী, যেখানে আপনি বড় পরিসরের ডেটা প্রক্রিয়া না করেও নির্দিষ্ট ডেটা পেতে পারেন। উদাহরণস্বরূপ, যদি আপনার কাছে একটি বড় list থাকে তবে লেজি কালেকশন কেবল সেই উপাদানটি রিট্রিভ করবে যেটি আপনার প্রয়োজন এবং অন্য কোনো উপাদান রিট্রিভ করবে না।
Apache Commons Collections লাইব্রেরি Lazy Collections তৈরি করার জন্য LazyList
, LazyMap
, এবং অন্যান্য কাস্টম Lazy কোড ব্যবহার করে। এই লাইব্রেরি আপনাকে Lazy Collection বাস্তবায়ন করতে সহায়তা করে।
LazyList একটি বিশেষ ধরনের List যা উপাদানগুলোকে lazy load বা প্রক্রিয়া করে।
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.collections4.list.LazyList;
import org.apache.commons.collections4.functors.ConstantTransformer;
import java.util.List;
public class LazyListExample {
public static void main(String[] args) {
// Creating a LazyList that lazily transforms all elements to uppercase
List<String> lazyList = LazyList.decorate(ListUtils.lazyList(new java.util.ArrayList<>()), new ConstantTransformer("default"));
// Adding items lazily
lazyList.add("apple");
lazyList.add("banana");
// Accessing elements lazily
System.out.println(lazyList.get(0)); // Will print "apple"
System.out.println(lazyList.get(1)); // Will print "banana"
}
}
LazyList.decorate()
মেথডটি ব্যবহার করে একটি lazy list তৈরি করা হয়েছে। এটি একটি ArrayList ডেকোরেট করে এবং প্রতিটি নতুন উপাদানকে lazy load করবে।ConstantTransformer
ব্যবহার করা হয়েছে, যা lazy initialization এর মাধ্যমে default value প্রদান করে।LazyMap একটি বিশেষ ধরনের Map যা lazy load এর মাধ্যমে কীগুলির জন্য মান রিটার্ন করে। এটি মূলত LazyList
এর মতো কাজ করে, তবে এটি একটি Map ডেটা স্ট্রাকচার ব্যবহারের জন্য ডিজাইন করা হয়েছে।
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.collections4.map.LazyMap;
import org.apache.commons.collections4.functors.ConstantTransformer;
import java.util.HashMap;
import java.util.Map;
public class LazyMapExample {
public static void main(String[] args) {
// Creating a LazyMap that lazily transforms all keys
Map<String, String> lazyMap = LazyMap.decorate(new HashMap<String, String>(), new ConstantTransformer("default"));
// Adding key-value pairs lazily
lazyMap.put("name", "Alice");
lazyMap.put("age", "30");
// Accessing keys lazily
System.out.println(lazyMap.get("name")); // Will print "Alice"
System.out.println(lazyMap.get("age")); // Will print "30"
System.out.println(lazyMap.get("address")); // Will print "default"
}
}
LazyMap.decorate()
মেথডটি ব্যবহার করে একটি lazy map তৈরি করা হয়েছে। এখানে ConstantTransformer
ব্যবহার করা হয়েছে, যা একটি ডিফল্ট মান প্রদান করে যখন Map এ নির্দিষ্ট কীগুলির মান উপস্থিত না থাকে।address
কীগুলি রিটার্ন করতে চেয়েছি, যেটি মাপে নেই, তখন এটি ডিফল্ট মান প্রদান করেছে ("default")।Lazy Collections Apache Commons Collections লাইব্রেরির একটি শক্তিশালী বৈশিষ্ট্য যা মেমরি ও পারফরম্যান্স অপ্টিমাইজেশনের জন্য কার্যকর। LazyList এবং LazyMap ব্যবহার করে আপনি কেবলমাত্র প্রয়োজনীয় উপাদানগুলি লোড করতে পারবেন এবং বড় আকারের ডেটা সেটের সাথে কাজ করার সময় এটি কার্যকরী হতে পারে। তবে, এগুলির ব্যবহারের সময় complexity এবং thread safety এর প্রতি মনোযোগ দেওয়া প্রয়োজন।
অ্যাপাচি কমন্স কালেকশনস (Apache Commons Collections) একটি শক্তিশালী জাভা লাইব্রেরি যা জাভা প্রোগ্রামে উন্নত ডেটা স্ট্রাকচার এবং ইউটিলিটি সরবরাহ করে। এর মধ্যে Bounded Collections ব্যবহারের মাধ্যমে আপনি কালেকশনগুলোতে উপাদানের সংখ্যা নির্ধারণ করতে পারেন, অর্থাৎ একটি নির্দিষ্ট সীমা (boundary) পর্যন্ত উপাদান রাখতে পারবেন। এটি বিশেষভাবে উপকারী যখন আপনি একটি কালেকশনের আকার সীমাবদ্ধ করতে চান বা এর আকারের উপর কিছু নিয়ন্ত্রণ রাখতে চান।
Bounded Collections সাধারণত Queue, List, অথবা Set এর মতো ডেটা স্ট্রাকচারে ব্যবহৃত হয়, যেখানে আপনি চাইবেন যে কালেকশনটি নির্দিষ্ট আকারের বেশি না হয়ে যায়। অ্যাপাচি কমন্স কালেকশনসে Bounded Collection ক্লাস যেমন BoundedList, BoundedSet, BoundedQueue ইত্যাদি অন্তর্ভুক্ত রয়েছে।
BoundedList একটি List টাইপের কালেকশন যা একটি নির্দিষ্ট আকার পর্যন্ত উপাদান ধারণ করতে পারে। যখন এই লিস্টে উপাদানের সংখ্যা পূর্ণ হয়ে যায়, নতুন উপাদান যুক্ত করার সময় এটি পুরনো উপাদান সরিয়ে ফেলে।
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.collections4.collection.GrowingList;
import java.util.List;
public class BoundedListExample {
public static void main(String[] args) {
// Create a Bounded List with a limit of 3 elements
List<String> list = ListUtils.predicatedList(new GrowingList<String>(3), input -> true);
// Add elements to the list
list.add("apple");
list.add("banana");
list.add("orange");
// The list is full, so adding another element will remove the first element (apple)
list.add("grape");
// Print the elements of the list
System.out.println(list); // Output: [banana, orange, grape]
}
}
এখানে, GrowingList ব্যবহার করা হয়েছে যা ৩টি উপাদান ধারণ করতে পারে। যখন ৩টি উপাদান যোগ করা হয়েছে, তখন নতুন উপাদান "grape" যুক্ত করার জন্য পুরনো উপাদান "apple" সরিয়ে ফেলা হয়েছে।
BoundedQueue একটি কিউ (Queue) টাইপের কালেকশন যা একটি নির্দিষ্ট সীমায় উপাদান ধারণ করতে পারে। এটি FIFO (First-In-First-Out) নিয়মে কাজ করে এবং যখন কিউটি পূর্ণ হয়ে যায়, নতুন উপাদান যুক্ত করার সময় পুরনো উপাদান সরিয়ে ফেলা হয়।
import org.apache.commons.collections4.queue.CircularFifoQueue;
import java.util.Queue;
public class BoundedQueueExample {
public static void main(String[] args) {
// Create a Bounded Queue with a limit of 3 elements
Queue<String> queue = new CircularFifoQueue<>(3);
// Add elements to the queue
queue.add("apple");
queue.add("banana");
queue.add("orange");
// The queue is full, so adding another element will remove the first element (apple)
queue.add("grape");
// Print the elements of the queue
System.out.println(queue); // Output: [banana, orange, grape]
}
}
এখানে CircularFifoQueue ব্যবহার করা হয়েছে, যা FIFO নিয়মে কাজ করে এবং একটি নির্দিষ্ট সীমায় উপাদান ধারণ করে। apple উপাদানটি কিউ থেকে সরিয়ে ফেলেছে grape যোগ করার সময়।
BoundedSet একটি Set টাইপের কালেকশন যা একটি নির্দিষ্ট সীমায় উপাদান ধারণ করতে পারে এবং নতুন উপাদান যোগ করার সময় সেটি পুরনো উপাদান সরিয়ে ফেলে। সাধারণত, এটি ব্যবহৃত হয় যখন আপনি অনন্য উপাদান রাখতে চান এবং তাদের সংখ্যা সীমিত করতে চান।
import org.apache.commons.collections4.SetUtils;
import org.apache.commons.collections4.set.LazySet;
import java.util.Set;
public class BoundedSetExample {
public static void main(String[] args) {
// Create a Bounded Set with a limit of 3 elements
Set<String> set = SetUtils.predicatedSet(new LazySet<String>(), input -> true);
// Add elements to the set
set.add("apple");
set.add("banana");
set.add("orange");
// The set is full, so adding another element will remove the first element (apple)
set.add("grape");
// Print the elements of the set
System.out.println(set); // Output: [banana, orange, grape]
}
}
এখানে, LazySet ব্যবহার করা হয়েছে, যা একটি সেটের মাধ্যমে একে অপরের সাথে সম্পর্কিত উপাদান রাখে এবং সীমিত আকারে ম্যানেজ করা হয়।
Bounded Collections হল এমন একটি কালেকশন যা নির্দিষ্ট সীমায় উপাদান ধারণ করতে সক্ষম এবং নতুন উপাদান যোগ করার সময় পুরনো উপাদানগুলো সরিয়ে ফেলে। অ্যাপাচি কমন্স কালেকশনস লাইব্রেরিতে BoundedQueue, BoundedList, এবং BoundedSet এর মতো বিভিন্ন ধরনের বাউন্ডেড কালেকশন রয়েছে, যা FIFO বা অন্যান্য নিয়মে কাজ করে এবং ডেটা স্ট্রাকচারের আকার নিয়ন্ত্রণ করতে সাহায্য করে। Bounded Collections ব্যবহারের মাধ্যমে আপনি ডেটা সংগ্রহের আকার সীমাবদ্ধ করতে পারেন, মেমরি ব্যবস্থাপনা করতে পারেন, এবং দ্রুত এবং কার্যকরী ডেটা প্রসেসিং নিশ্চিত করতে পারেন।
common.read_more